Run download_data.Rmd and percentage_of_regional_richness.Rmd First!
city_data
fetch_city_data_for <- function(pool_name, include_city_name = F, include_pool_size = T) {
results_filename <- paste(paste('percentage_of_regional_richness__output_', pool_name, 'city', 'richness', 'intercept', sep = "_"), "csv", sep = ".")
results <- read_csv(results_filename)
joined <- left_join(city_data, results)
pool_size_col_name <- paste(pool_name, 'pool', 'size', sep = "_")
required_columns <- c("population_growth", "rainfall_monthly_min", "rainfall_annual_average", "rainfall_monthly_max", "temperature_annual_average", "temperature_monthly_min", "temperature_monthly_max", "happiness_negative_effect", "happiness_positive_effect", "happiness_future_life", "number_of_biomes", "realm", "biome_name", "region_20km_includes_estuary", "region_50km_includes_estuary", "region_100km_includes_estuary", "city_includes_estuary", "region_20km_average_pop_density", "region_50km_average_pop_density", "region_100km_average_pop_density", "city_max_pop_density", "city_average_pop_density", "mean_population_exposure_to_pm2_5_2019", "region_20km_cultivated", "region_20km_urban", "region_50km_cultivated", "region_50km_urban", "region_100km_cultivated", "region_100km_urban", "region_20km_elevation_delta", "region_20km_mean_elevation", "region_50km_elevation_delta", "region_50km_mean_elevation", "region_100km_elevation_delta", "region_100km_mean_elevation", "city_elevation_delta", "city_mean_elevation", "urban", "shrubs", "permanent_water", "open_forest", "herbaceous_wetland", "herbaceous_vegetation", "cultivated", "closed_forest", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_streets", "percentage_urban_area_as_open_public_spaces_and_streets", "percentage_urban_area_as_open_public_spaces", "city_gdp_per_population", "city_ndvi", "city_ssm", "city_susm", "region_20km_ndvi", "region_20km_ssm", "region_20km_susm", "region_50km_ndvi", "region_50km_ssm", "region_50km_susm", "region_100km_ndvi", "region_100km_ssm", "region_100km_susm", "city_percentage_protected", "region_20km_percentage_protected", "region_50km_percentage_protected", "region_100km_percentage_protected")
if (include_pool_size) {
required_columns <- append(c(pool_size_col_name), required_columns)
}
if (include_city_name) {
required_columns <- append(c("name"), required_columns)
}
required_columns <- append(c("response"), required_columns)
joined[,required_columns]
}
library(randomForest)
randomForest 4.6-14
Type rfNews() to see new features/changes/bug fixes.
library(reshape2)
library(rpart)
library(ggplot2)
Attaching package: ‘ggplot2’
The following object is masked from ‘package:randomForest’:
margin
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ tibble 3.1.2 ✓ dplyr 1.0.7
✓ tidyr 1.1.3 ✓ stringr 1.4.0
✓ readr 1.4.0 ✓ forcats 0.5.1
✓ purrr 0.3.4
── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::combine() masks randomForest::combine()
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
x ggplot2::margin() masks randomForest::margin()
library(multcomp)
Loading required package: mvtnorm
Loading required package: survival
Attaching package: ‘survival’
The following object is masked from ‘package:boot’:
aml
Loading required package: TH.data
Loading required package: MASS
Attaching package: ‘MASS’
The following object is masked from ‘package:dplyr’:
select
Attaching package: ‘TH.data’
The following object is masked from ‘package:MASS’:
geyser
library(car)
Loading required package: carData
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Registered S3 methods overwritten by 'car':
method from
influence.merMod lme4
cooks.distance.influence.merMod lme4
dfbeta.influence.merMod lme4
dfbetas.influence.merMod lme4
Attaching package: ‘car’
The following object is masked from ‘package:dplyr’:
recode
The following object is masked from ‘package:purrr’:
some
The following object is masked from ‘package:boot’:
logit
merlin_city_data_fixed <- rfImpute(response ~ ., merlin_city_data)
merlin_city_data_fixed

source('./helper__random_forest_selection_functions.R')
scale_parameter_name <- function(scale, postscript) {
paste('region', paste(scale, 'km', sep = ''), postscript, sep = '_')
}
scale_parameters <- function(postscript) {
c(scale_parameter_name(20, postscript), scale_parameter_name(50, postscript), scale_parameter_name(100, postscript))
}
scales_parameters_without <- function(scale_to_exclude, postscript) {
scales <- scale_parameters(postscript)
scales[scales != scale_parameter_name(scale_to_exclude, postscript)]
}
select_scales <- function(urban, cultivated, elevation_delta, mean_elevation, average_pop_density, includes_estuary, ssm, susm, ndvi, percentage_protected) {
append(
append(
append(
append(
scales_parameters_without(scale_to_exclude = urban, postscript = 'urban'),
scales_parameters_without(scale_to_exclude = cultivated, postscript = 'cultivated')
),
append(
scales_parameters_without(scale_to_exclude = elevation_delta, postscript = 'elevation_delta'),
scales_parameters_without(scale_to_exclude = mean_elevation, postscript = 'mean_elevation')
)
),
append(
append(
scales_parameters_without(scale_to_exclude = average_pop_density, postscript = 'average_pop_density'),
scales_parameters_without(scale_to_exclude = includes_estuary, postscript = 'includes_estuary')
),
append(
scales_parameters_without(scale_to_exclude = ssm, postscript = 'ssm'),
scales_parameters_without(scale_to_exclude = susm, postscript = 'susm')
)
)
),
append(
scales_parameters_without(scale_to_exclude = ndvi, postscript = 'ndvi'),
scales_parameters_without(scale_to_exclude = percentage_protected, postscript = 'percentage_protected')
)
)
}
select_scales(urban = 20, cultivated = 100, elevation_delta = 20, mean_elevation = 100, average_pop_density = NA, includes_estuary = NA, ssm = 20, susm = 20, ndvi = 100, percentage_protected = NA)
select_scales(urban = , cultivated = , elevation_delta = , mean_elevation = , average_pop_density = , includes_estuary = , ssm = , susm = , ndvi =, percentage_protected = )
select_variables_from_random_forest(merlin_city_data_fixed)
exclude_merlin <- !names(merlin_city_data_fixed) %in% select_scales(urban = 20, cultivated = 100, elevation_delta = 50, mean_elevation = 20, average_pop_density = 50, includes_estuary = NA, ssm = 100, susm = 50, ndvi = 20, percentage_protected = 50)
merlin_city_data_fixed_single_scale <- merlin_city_data_fixed[,exclude_merlin]
merlin_city_data_fixed_single_scale
select_variables_from_random_forest(merlin_city_data_fixed_single_scale)
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi", "temperature_monthly_max")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi", "temperature_monthly_max", "city_average_pop_density")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi", "temperature_monthly_max", "city_average_pop_density", "region_50km_average_pop_density")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta", "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs", "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi", "temperature_monthly_max", "city_average_pop_density", "region_50km_average_pop_density", "rainfall_annual_average")])
“merlin_pool_size”, “biome_name”, “realm”
birdlife_city_data <- fetch_city_data_for('birdlife')
birdlife_city_data

birdlife_city_data_fixed <- rfImpute(response ~ ., birdlife_city_data)
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.317 36.68 |
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.381 37.69 |
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.343 37.08 |
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.234 35.37 |
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.353 37.24 |
birdlife_city_data_fixed <- rfImpute(response ~ ., birdlife_city_data)
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.41 38.15 |
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.438 38.60 |
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.299 36.39 |
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.348 37.16 |
| Out-of-bag |
Tree | MSE %Var(y) |
300 | 2.158 34.16 |
birdlife_city_data_fixed
select_variables_from_random_forest(birdlife_city_data_fixed)
exclude_birdlife <- !names(birdlife_city_data_fixed) %in% select_scales(urban = 100, cultivated = 100, elevation_delta = 20, mean_elevation = 100, average_pop_density = 20, includes_estuary = NA, ssm = 50, susm = 100, ndvi = 100, percentage_protected = 100)
birdlife_city_data_fixed_single_scale <- birdlife_city_data_fixed[,exclude_birdlife]
birdlife_city_data_fixed_single_scale
select_variables_from_random_forest(birdlife_city_data_fixed_single_scale)
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets", "rainfall_annual_average")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets", "rainfall_annual_average", "city_susm")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets", "rainfall_annual_average", "city_susm", "region_100km_ndvi")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets", "rainfall_annual_average", "city_susm", "region_100km_ndvi", "happiness_future_life")])
“population_growth”, “region_50km_ssm”, “birdlife_pool_size”
| Merlin: “merlin_pool_size”, “biome_name”, “realm” Birdlife: “population_growth”, “region_50km_ssm”, “birdlife_pool_size” |
Try Modelling
library(boot)
test_model(birdlife_city_data_fixed_no_boreal, response ~ birdlife_pool_size + realm)
[1] "R2 0.215771844466201"
[1] "CV Delta 5.38032952583311" "CV Delta 5.37866865996081"
| Use cross validation and dropping terms to find best model |
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + population_growth + region_50km_ssm + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 14.51828
– Can we drop one?
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + population_growth + region_50km_ssm + biome_name, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.8059
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + population_growth + region_50km_ssm + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.46984
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + population_growth + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 14.39671
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + region_50km_ssm + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 14.30384
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 20.17595
– drop populaion_growth (14.30384)
– can we drop another?
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + region_50km_ssm + biome_name, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.56925
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + region_50km_ssm + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.24412
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 14.20889
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 20.17595
– drop ssm (14.20889)
– can we drop another?
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + biome_name, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.38282
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.10131
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 20.56763
– drop biome (13.10131)
select_variables_from_random_forest(either_city_data_fixed_single_scale)
[1] "either_pool_size" "region_50km_ssm" "population_growth"
[4] "region_100km_cultivated" "realm" "region_20km_average_pop_density"
[7] "region_100km_susm" "city_ssm" "temperature_monthly_min"
[10] "shrubs" "region_50km_elevation_delta" "biome_name"
[13] "permanent_water" "rainfall_monthly_min" "share_of_population_within_400m_of_open_space"
[16] "percentage_urban_area_as_open_public_spaces" "mean_population_exposure_to_pm2_5_2019" "temperature_annual_average"
[19] "city_average_pop_density" "percentage_urban_area_as_open_public_spaces_and_streets" "happiness_positive_effect"
[22] "city_mean_elevation" "region_20km_ndvi" "city_ndvi"
[25] "rainfall_annual_average" "city_susm" "region_50km_mean_elevation"
[28] "temperature_monthly_max" "open_forest" "happiness_negative_effect"
[31] "herbaceous_vegetation" "closed_forest" "percentage_urban_area_as_streets"
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.48513
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size * realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.85502
| – best model with merlin is pool size + realm (CV error 13.10131) |
summary(glm(data = merlin_city_data_fixed, formula = response ~ merlin_pool_size + realm))
Call:
glm(formula = response ~ merlin_pool_size + realm, data = merlin_city_data_fixed)
Deviance Residuals:
Min 1Q Median 3Q Max
-8.5046 -1.6225 -0.5191 1.4001 16.3762
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.155064 0.927938 6.633 8.03e-10 ***
merlin_pool_size -0.028445 0.003408 -8.346 9.02e-14 ***
realmNearctic 3.089566 1.035703 2.983 0.00341 **
realmAustralasia -0.304872 2.107524 -0.145 0.88520
realmIndomalayan 1.888475 0.823167 2.294 0.02339 *
realmNeotropic 3.355053 0.997078 3.365 0.00101 **
realmAfrotropic 1.602668 1.215952 1.318 0.18981
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for gaussian family taken to be 12.36947)
Null deviance: 2469.6 on 136 degrees of freedom
Residual deviance: 1608.0 on 130 degrees of freedom
AIC: 742.19
Number of Fisher Scoring iterations: 2
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm + biome_name + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.817509
– can we drop a variable?
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm + biome_name, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.1237
test_model(either_city_data_fixed, response ~ either_pool_size)
[1] "R2 0.200828561945557"
[1] "CV Delta 4.17185408588075" "CV Delta 4.17145621339379"
test_model(either_city_data_fixed, response ~ either_pool_size + region_50km_ssm)
[1] "R2 0.218556419678468"
[1] "CV Delta 4.1385005044194" "CV Delta 4.13789124054347"
test_model(either_city_data_fixed, response ~ either_pool_size + region_50km_ssm + population_growth)
[1] "R2 0.218651209733749"
[1] "CV Delta 4.24526922992079" "CV Delta 4.24423824005575"
test_model(either_city_data_fixed, response ~ either_pool_size + region_50km_ssm + population_growth + region_100km_cultivated)
[1] "R2 0.240163336907313"
[1] "CV Delta 4.1925470002567" "CV Delta 4.19130237140134"
– drop biome (5.492536)
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.686036
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.499406
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + region_50km_ssm + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.38609
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ population_growth + region_50km_ssm + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.690224
– drop population growth (5.38609)
cor(either_city_data_fixed$residuals, either_city_data_fixed$response)
[1] 0.8072575
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.38033
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.637624
– drop ssm (5.38033)
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.613765
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.746644
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size * realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
| – so best model with birdlife is pool size + realm |
birdlife_city_data_fixed$realm <- factor(birdlife_city_data_fixed$realm, levels = c("Palearctic", "Nearctic", "Australasia", "Indomalayan", "Neotropic", "Afrotropic"))
summary(glm(data = birdlife_city_data_fixed, formula = response ~ birdlife_pool_size + realm))
Call:
glm(formula = response ~ birdlife_pool_size + realm, data = birdlife_city_data_fixed)
Deviance Residuals:
Min 1Q Median 3Q Max
-5.9219 -1.2809 -0.3423 0.8298 9.5036
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.16482 0.64778 4.886 2.98e-06 ***
birdlife_pool_size -0.01493 0.00252 -5.926 2.62e-08 ***
realmNearctic 0.58805 0.63743 0.923 0.35796
realmAustralasia 1.04651 1.38301 0.757 0.45060
realmIndomalayan 1.87907 0.60496 3.106 0.00233 **
realmNeotropic 2.26051 0.70591 3.202 0.00171 **
realmAfrotropic 2.54804 0.89206 2.856 0.00499 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for gaussian family taken to be 5.241433)
Null deviance: 865.45 on 136 degrees of freedom
Residual deviance: 681.39 on 130 degrees of freedom
AIC: 624.56
Number of Fisher Scoring iterations: 2
ggplot(merlin_city_data_fixed_no_boreal, aes(x = merlin_pool_size, y = response)) + geom_point() + geom_smooth(method = "glm", se = F) + facet_wrap(~ realm)
`geom_smooth()` using formula 'y ~ x'

ggplot(birdlife_city_data_fixed_no_boreal, aes(x = birdlife_pool_size, y = response)) + geom_point() + geom_smooth(method = "glm", se = F) + facet_wrap(~ realm)
`geom_smooth()` using formula 'y ~ x'





ggplot(birdlife_city_data_fixed_no_boreal, aes(x = birdlife_pool_size, y = response)) +
geom_point(size=1) +
geom_smooth(method = "glm", se = F) +
geom_text(aes(label = name), data = birdlife_city_data_fixed_no_boreal[c(16, 53, 123),], size = 3, position = "dodge", vjust = "inward", hjust = "inward", color = "red", angle=-15) +
geom_point(data = birdlife_city_data_fixed_no_boreal[c(16, 53, 123),], color = "red") +
facet_wrap(~ realm) +
theme_bw() +
ylab("City Random Effect Intercept") + xlab("Regional Pool Size") + labs(title = "Birdlife")
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`
ggsave("city_effect_richness_birdlife.jpg")
Saving 7.29 x 4.51 in image
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

merlin.fit <- glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ merlin_pool_size + realm)
summary(merlin.fit)
Call:
glm(formula = response ~ merlin_pool_size + realm, data = merlin_city_data_fixed_no_boreal)
Deviance Residuals:
Min 1Q Median 3Q Max
-8.5389 -1.7132 -0.5164 1.3898 16.2335
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.823312 1.406157 5.564 1.46e-07 ***
merlin_pool_size -0.028685 0.003401 -8.434 5.79e-14 ***
realmAustralasia -1.923665 2.294340 -0.838 0.403
realmIndomalayan 0.288224 1.193798 0.241 0.810
realmNearctic 1.499468 1.327678 1.129 0.261
realmNeotropic 1.767199 1.293308 1.366 0.174
realmPalearctic -1.490884 1.214536 -1.228 0.222
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for gaussian family taken to be 12.28537)
Null deviance: 2458.9 on 135 degrees of freedom
Residual deviance: 1584.8 on 129 degrees of freedom
AIC: 735.91
Number of Fisher Scoring iterations: 2
with(summary(merlin.fit), 1 - deviance/null.deviance)
[1] 0.3554797
plot(merlin.fit)




ggplot(merlin_city_data_fixed_no_boreal, aes(x = merlin_pool_size, y = response)) +
geom_point(size = 1) +
geom_smooth(method = "glm", se = F) +
geom_text(aes(label = name), data = merlin_city_data_fixed_no_boreal[c(7, 24, 77),], size = 3, position = "dodge", vjust = "inward", hjust = "inward", color = "red", angle=-15) +
geom_point(data = merlin_city_data_fixed_no_boreal[c(7, 24, 77),], color = "red") +
facet_wrap(~ realm) +
theme_bw() +
ylab("City Random Effect Intercept") + xlab("Regional Pool Size") + labs(title = "eBird")
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`
ggsave("city_effect_richness_merlin.jpg")
Saving 7.29 x 4.51 in image
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

merlin_city_data_fixed_no_boreal$residuals <- resid(merlin.fit)
ggplot(merlin_city_data_fixed_no_boreal, aes(y = response, x = residuals)) +
geom_smooth(method = "lm", se = F) +
geom_point(aes(color = realm)) +
geom_text(aes(label = name), data = merlin_city_data_fixed_no_boreal[c(7, 24, 77),], size = 4, position = "dodge", vjust = "inward", hjust = "inward") +
labs(title = "Merlin", subtitle = paste("Correlation", cor(merlin_city_data_fixed_no_boreal$residuals, merlin_city_data_fixed_no_boreal$response))) +
theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

birdlife_city_data_fixed_no_boreal$residuals <- resid(birdlife.fit)
ggplot(birdlife_city_data_fixed_no_boreal, aes(y = response, x = residuals)) +
geom_smooth(method = "lm", se = F, alpha = 0.5) +
geom_point(aes(color = realm)) +
geom_text(aes(label = name), data = birdlife_city_data_fixed_no_boreal[c(16, 53, 124),], size = 4, position = "dodge", vjust = "inward", hjust = "inward") +
labs(title = "Birdlife", subtitle = paste("Correlation", cor(birdlife_city_data_fixed_no_boreal$residuals, birdlife_city_data_fixed_no_boreal$response))) +
theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`


birdlife.aov <- aov(birdlife_city_data_fixed_no_boreal$residuals_of_fit ~ birdlife_city_data_fixed_no_boreal$realm)
summary(birdlife.aov)
Df Sum Sq Mean Sq F value Pr(>F)
birdlife_city_data_fixed_no_boreal$realm 5 0.16 0.0315 0.022 1
Residuals 130 184.77 1.4213
merlin_city_data_fixed_no_boreal$residuals_of_fit <- resid(lm(response ~ residuals, merlin_city_data_fixed_no_boreal))
ggplot(merlin_city_data_fixed_no_boreal, aes(x = realm, y = residuals_of_fit)) + geom_boxplot()

merlin.aov <- aov(merlin_city_data_fixed_no_boreal$residuals_of_fit ~ merlin_city_data_fixed_no_boreal$realm)
summary(merlin.aov)
Df Sum Sq Mean Sq F value Pr(>F)
merlin_city_data_fixed_no_boreal$realm 5 0.2 0.040 0.006 1
Residuals 130 873.9 6.722
ggplot(merlin_city_data_fixed_no_boreal, aes(residuals)) + geom_histogram(binwidth = 1)

ggplot(birdlife_city_data_fixed_no_boreal, aes(residuals)) + geom_histogram(binwidth = 1)

shapiro.test(birdlife_city_data_fixed_no_boreal$response)
Shapiro-Wilk normality test
data: birdlife_city_data_fixed_no_boreal$response
W = 0.93733, p-value = 8.842e-06
shapiro.test(birdlife_city_data_fixed_no_boreal$residuals)
Shapiro-Wilk normality test
data: birdlife_city_data_fixed_no_boreal$residuals
W = 0.94253, p-value = 2.095e-05
shapiro.test(birdlife_city_data_fixed_no_boreal$residuals_of_fit)
Shapiro-Wilk normality test
data: birdlife_city_data_fixed_no_boreal$residuals_of_fit
W = 0.90395, p-value = 7.391e-08
shapiro.test(merlin_city_data_fixed_no_boreal$response)
Shapiro-Wilk normality test
data: merlin_city_data_fixed_no_boreal$response
W = 0.95308, p-value = 0.0001366
shapiro.test(merlin_city_data_fixed_no_boreal$residuals)
Shapiro-Wilk normality test
data: merlin_city_data_fixed_no_boreal$residuals
W = 0.93318, p-value = 4.568e-06
shapiro.test(merlin_city_data_fixed_no_boreal$residuals_of_fit)
Shapiro-Wilk normality test
data: merlin_city_data_fixed_no_boreal$residuals_of_fit
W = 0.94707, p-value = 4.596e-05
Variances of groups are NOT significantly different:
bartlett.test(merlin_city_data_fixed_no_boreal$residuals, merlin_city_data_fixed_no_boreal$realm)
Bartlett test of homogeneity of variances
data: merlin_city_data_fixed_no_boreal$residuals and merlin_city_data_fixed_no_boreal$realm
Bartlett's K-squared = 12.245, df = 5, p-value = 0.03159
leveneTest(merlin_city_data_fixed_no_boreal$residuals, merlin_city_data_fixed_no_boreal$realm)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 5 1.22 0.3033
130
Variances of groups are NOT significantly different:
bartlett.test(birdlife_city_data_fixed_no_boreal$residuals, birdlife_city_data_fixed_no_boreal$realm)
Bartlett test of homogeneity of variances
data: birdlife_city_data_fixed_no_boreal$residuals and birdlife_city_data_fixed_no_boreal$realm
Bartlett's K-squared = 16.504, df = 5, p-value = 0.005544
leveneTest(birdlife_city_data_fixed_no_boreal$residuals, birdlife_city_data_fixed_no_boreal$realm)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 5 1.4422 0.2134
130
Variances of groups are significantly different:
bartlett.test(merlin_city_data_fixed_no_boreal$residuals_of_fit, merlin_city_data_fixed_no_boreal$realm)
Bartlett test of homogeneity of variances
data: merlin_city_data_fixed_no_boreal$residuals_of_fit and merlin_city_data_fixed_no_boreal$realm
Bartlett's K-squared = 63.781, df = 5, p-value = 2.006e-12
leveneTest(merlin_city_data_fixed_no_boreal$residuals_of_fit, merlin_city_data_fixed_no_boreal$realm)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 5 7.1996 5.587e-06 ***
130
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Variances of groups are significantly different:
bartlett.test(birdlife_city_data_fixed_no_boreal$residuals_of_fit, birdlife_city_data_fixed_no_boreal$realm)
Bartlett test of homogeneity of variances
data: birdlife_city_data_fixed_no_boreal$residuals_of_fit and birdlife_city_data_fixed_no_boreal$realm
Bartlett's K-squared = 77.857, df = 5, p-value = 2.355e-15
leveneTest(birdlife_city_data_fixed_no_boreal$residuals_of_fit, birdlife_city_data_fixed_no_boreal$realm)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 5 9.9859 4.199e-08 ***
130
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
AIC(
glm(data = merlin_city_data_fixed, formula = response ~ merlin_pool_size + population_growth + region_50km_ssm + biome_name + realm),
glm(data = merlin_city_data_fixed, formula = response ~ merlin_pool_size + realm)
)
AIC(
glm(data = birdlife_city_data_fixed, formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm + biome_name + realm),
glm(data = birdlife_city_data_fixed, formula = response ~ birdlife_pool_size + realm)
)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpSdW4gYGRvd25sb2FkX2RhdGEuUm1kYCBhbmQgYHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3MuUm1kYCBGaXJzdCEKCmBgYHtyfQpjaXR5X2RhdGEKYGBgCgoKYGBge3J9CmZldGNoX2NpdHlfZGF0YV9mb3IgPC0gZnVuY3Rpb24ocG9vbF9uYW1lLCBpbmNsdWRlX2NpdHlfbmFtZSA9IEYsIGluY2x1ZGVfcG9vbF9zaXplID0gVCkgewogIHJlc3VsdHNfZmlsZW5hbWUgPC0gcGFzdGUocGFzdGUoJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF8nLCBwb29sX25hbWUsICdjaXR5JywgJ3JpY2huZXNzJywgJ2ludGVyY2VwdCcsIHNlcCA9ICJfIiksICJjc3YiLCBzZXAgPSAiLiIpCiAgcmVzdWx0cyA8LSByZWFkX2NzdihyZXN1bHRzX2ZpbGVuYW1lKQogIAogIGpvaW5lZCA8LSBsZWZ0X2pvaW4oY2l0eV9kYXRhLCByZXN1bHRzKQogIAogIHBvb2xfc2l6ZV9jb2xfbmFtZSA8LSBwYXN0ZShwb29sX25hbWUsICdwb29sJywgJ3NpemUnLCBzZXAgPSAiXyIpCiAgCiAgcmVxdWlyZWRfY29sdW1ucyA8LSBjKCJwb3B1bGF0aW9uX2dyb3d0aCIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21heCIsICJoYXBwaW5lc3NfbmVnYXRpdmVfZWZmZWN0IiwgImhhcHBpbmVzc19wb3NpdGl2ZV9lZmZlY3QiLCAiaGFwcGluZXNzX2Z1dHVyZV9saWZlIiwgIm51bWJlcl9vZl9iaW9tZXMiLCAicmVhbG0iLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMjBrbV9pbmNsdWRlc19lc3R1YXJ5IiwgInJlZ2lvbl81MGttX2luY2x1ZGVzX2VzdHVhcnkiLCAicmVnaW9uXzEwMGttX2luY2x1ZGVzX2VzdHVhcnkiLCAiY2l0eV9pbmNsdWRlc19lc3R1YXJ5IiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJyZWdpb25fMTAwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X21heF9wb3BfZGVuc2l0eSIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAibWVhbl9wb3B1bGF0aW9uX2V4cG9zdXJlX3RvX3BtMl81XzIwMTkiLCAicmVnaW9uXzIwa21fY3VsdGl2YXRlZCIsICJyZWdpb25fMjBrbV91cmJhbiIsICJyZWdpb25fNTBrbV9jdWx0aXZhdGVkIiwgInJlZ2lvbl81MGttX3VyYmFuIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmVnaW9uXzIwa21fbWVhbl9lbGV2YXRpb24iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgInJlZ2lvbl81MGttX21lYW5fZWxldmF0aW9uIiwgInJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmVnaW9uXzEwMGttX21lYW5fZWxldmF0aW9uIiwgImNpdHlfZWxldmF0aW9uX2RlbHRhIiwgImNpdHlfbWVhbl9lbGV2YXRpb24iLCAidXJiYW4iLCAic2hydWJzIiwgInBlcm1hbmVudF93YXRlciIsICJvcGVuX2ZvcmVzdCIsICJoZXJiYWNlb3VzX3dldGxhbmQiLCAiaGVyYmFjZW91c192ZWdldGF0aW9uIiwgImN1bHRpdmF0ZWQiLCAiY2xvc2VkX2ZvcmVzdCIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX3N0cmVldHMiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgImNpdHlfbmR2aSIsICJjaXR5X3NzbSIsICJjaXR5X3N1c20iLCAicmVnaW9uXzIwa21fbmR2aSIsICJyZWdpb25fMjBrbV9zc20iLCAicmVnaW9uXzIwa21fc3VzbSIsICJyZWdpb25fNTBrbV9uZHZpIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8xMDBrbV9uZHZpIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAicmVnaW9uXzEwMGttX3N1c20iLCAiY2l0eV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fMjBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fNTBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fMTAwa21fcGVyY2VudGFnZV9wcm90ZWN0ZWQiKQogIAogIGlmIChpbmNsdWRlX3Bvb2xfc2l6ZSkgewogICAgcmVxdWlyZWRfY29sdW1ucyA8LSBhcHBlbmQoYyhwb29sX3NpemVfY29sX25hbWUpLCByZXF1aXJlZF9jb2x1bW5zKQogIH0KICAKICBpZiAoaW5jbHVkZV9jaXR5X25hbWUpIHsKICAgIHJlcXVpcmVkX2NvbHVtbnMgPC0gYXBwZW5kKGMoIm5hbWUiKSwgcmVxdWlyZWRfY29sdW1ucykKICB9CiAgCiAgcmVxdWlyZWRfY29sdW1ucyA8LSBhcHBlbmQoYygicmVzcG9uc2UiKSwgcmVxdWlyZWRfY29sdW1ucykKICAKICBqb2luZWRbLHJlcXVpcmVkX2NvbHVtbnNdCn0KYGBgCgoKYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGEgPC0gZmV0Y2hfY2l0eV9kYXRhX2ZvcignbWVybGluJykKbWVybGluX2NpdHlfZGF0YQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShycGFydCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmxpYnJhcnkobXVsdGNvbXApCmxpYnJhcnkoY2FyKQpgYGAKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX2ZpeGVkIDwtIHJmSW1wdXRlKHJlc3BvbnNlIH4gLiwgbWVybGluX2NpdHlfZGF0YSkKbWVybGluX2NpdHlfZGF0YV9maXhlZApgYGAKCmBgYHtyfQpnZ3Bsb3QobWVybGluX2NpdHlfZGF0YV9maXhlZCwgYWVzKHJlc3BvbnNlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDIpCmBgYAoKYGBge3J9CnNvdXJjZSgnLi9oZWxwZXJfX3JhbmRvbV9mb3Jlc3Rfc2VsZWN0aW9uX2Z1bmN0aW9ucy5SJykKYGBgCgpgYGB7cn0Kc2NhbGVfcGFyYW1ldGVyX25hbWUgPC0gZnVuY3Rpb24oc2NhbGUsIHBvc3RzY3JpcHQpIHsKICBwYXN0ZSgncmVnaW9uJywgcGFzdGUoc2NhbGUsICdrbScsIHNlcCA9ICcnKSwgcG9zdHNjcmlwdCwgc2VwID0gJ18nKSAgCn0KCnNjYWxlX3BhcmFtZXRlcnMgPC0gZnVuY3Rpb24ocG9zdHNjcmlwdCkgewogIGMoc2NhbGVfcGFyYW1ldGVyX25hbWUoMjAsIHBvc3RzY3JpcHQpLCBzY2FsZV9wYXJhbWV0ZXJfbmFtZSg1MCwgcG9zdHNjcmlwdCksIHNjYWxlX3BhcmFtZXRlcl9uYW1lKDEwMCwgcG9zdHNjcmlwdCkpCn0KCnNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQgPC0gZnVuY3Rpb24oc2NhbGVfdG9fZXhjbHVkZSwgcG9zdHNjcmlwdCkgewogIHNjYWxlcyA8LSBzY2FsZV9wYXJhbWV0ZXJzKHBvc3RzY3JpcHQpCiAgc2NhbGVzW3NjYWxlcyAhPSBzY2FsZV9wYXJhbWV0ZXJfbmFtZShzY2FsZV90b19leGNsdWRlLCBwb3N0c2NyaXB0KV0KfQoKc2VsZWN0X3NjYWxlcyA8LSBmdW5jdGlvbih1cmJhbiwgY3VsdGl2YXRlZCwgZWxldmF0aW9uX2RlbHRhLCBtZWFuX2VsZXZhdGlvbiwgYXZlcmFnZV9wb3BfZGVuc2l0eSwgaW5jbHVkZXNfZXN0dWFyeSwgc3NtLCBzdXNtLCBuZHZpLCBwZXJjZW50YWdlX3Byb3RlY3RlZCkgewogIGFwcGVuZCgKICAgIGFwcGVuZCgKICAgICAgYXBwZW5kKAogICAgICAgIGFwcGVuZCgKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IHVyYmFuLCBwb3N0c2NyaXB0ID0gJ3VyYmFuJyksCiAgICAgICAgICBzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0KHNjYWxlX3RvX2V4Y2x1ZGUgPSBjdWx0aXZhdGVkLCBwb3N0c2NyaXB0ID0gJ2N1bHRpdmF0ZWQnKQogICAgICAgICksCiAgICAgICAgYXBwZW5kKAogICAgICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gZWxldmF0aW9uX2RlbHRhLCBwb3N0c2NyaXB0ID0gJ2VsZXZhdGlvbl9kZWx0YScpLAogICAgICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gbWVhbl9lbGV2YXRpb24sIHBvc3RzY3JpcHQgPSAnbWVhbl9lbGV2YXRpb24nKQogICAgICAgICkKICAgICAgKSwKICAgICAgYXBwZW5kKAogICAgICAgIGFwcGVuZCgKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IGF2ZXJhZ2VfcG9wX2RlbnNpdHksIHBvc3RzY3JpcHQgPSAnYXZlcmFnZV9wb3BfZGVuc2l0eScpLAogICAgICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gaW5jbHVkZXNfZXN0dWFyeSwgcG9zdHNjcmlwdCA9ICdpbmNsdWRlc19lc3R1YXJ5JykKICAgICAgICApLAogICAgICAgIGFwcGVuZCgKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IHNzbSwgcG9zdHNjcmlwdCA9ICdzc20nKSwKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IHN1c20sIHBvc3RzY3JpcHQgPSAnc3VzbScpCiAgICAgICAgKQogICAgICApCiAgICApLAogICAgYXBwZW5kKAogICAgICBzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0KHNjYWxlX3RvX2V4Y2x1ZGUgPSBuZHZpLCBwb3N0c2NyaXB0ID0gJ25kdmknKSwKICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gcGVyY2VudGFnZV9wcm90ZWN0ZWQsIHBvc3RzY3JpcHQgPSAncGVyY2VudGFnZV9wcm90ZWN0ZWQnKQogICAgKQogICkKfQpgYGAKCmBgYHtyfQpzZWxlY3Rfc2NhbGVzKHVyYmFuID0gMjAsIGN1bHRpdmF0ZWQgPSAxMDAsIGVsZXZhdGlvbl9kZWx0YSA9IDIwLCBtZWFuX2VsZXZhdGlvbiA9IDEwMCwgYXZlcmFnZV9wb3BfZGVuc2l0eSA9IE5BLCBpbmNsdWRlc19lc3R1YXJ5ID0gTkEsIHNzbSA9IDIwLCBzdXNtID0gMjAsIG5kdmkgPSAxMDAsIHBlcmNlbnRhZ2VfcHJvdGVjdGVkID0gTkEpCmBgYAoKc2VsZWN0X3NjYWxlcyh1cmJhbiA9ICwgY3VsdGl2YXRlZCA9ICwgZWxldmF0aW9uX2RlbHRhID0gLCBtZWFuX2VsZXZhdGlvbiA9ICwgYXZlcmFnZV9wb3BfZGVuc2l0eSA9ICwgaW5jbHVkZXNfZXN0dWFyeSA9ICwgc3NtID0gLCBzdXNtID0gLCBuZHZpID0sIHBlcmNlbnRhZ2VfcHJvdGVjdGVkID0gKQoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQpCmBgYAoKYGBge3J9CmV4Y2x1ZGVfbWVybGluIDwtICFuYW1lcyhtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkKSAlaW4lIHNlbGVjdF9zY2FsZXModXJiYW4gPSAyMCwgY3VsdGl2YXRlZCA9IDEwMCwgZWxldmF0aW9uX2RlbHRhID0gNTAsIG1lYW5fZWxldmF0aW9uID0gMjAsIGF2ZXJhZ2VfcG9wX2RlbnNpdHkgPSA1MCwgaW5jbHVkZXNfZXN0dWFyeSA9IE5BLCBzc20gPSAxMDAsIHN1c20gPSA1MCwgbmR2aSA9IDIwLCBwZXJjZW50YWdlX3Byb3RlY3RlZCA9IDUwKQoKbWVybGluX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUgPC0gbWVybGluX2NpdHlfZGF0YV9maXhlZFssZXhjbHVkZV9tZXJsaW5dCm1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfc2luZ2xlX3NjYWxlCmBgYAoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfc2luZ2xlX3NjYWxlKQpgYGAKCmBgYHtyfQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICAicmFpbmZhbGxfbW9udGhseV9taW4iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicGVybWFuZW50X3dhdGVyIiwgInJlZ2lvbl81MGttX3N1c20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iLCAic2hydWJzIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iLCAic2hydWJzIiwgICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJoYXBwaW5lc3NfcG9zaXRpdmVfZWZmZWN0IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicGVybWFuZW50X3dhdGVyIiwgInJlZ2lvbl81MGttX3N1c20iLCAicmVnaW9uXzIwa21fbmR2aSIsICJyZWdpb25fMjBrbV91cmJhbiIsICJzaHJ1YnMiLCAgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgImhhcHBpbmVzc19wb3NpdGl2ZV9lZmZlY3QiLCAiY2l0eV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iLCAic2hydWJzIiwgICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJoYXBwaW5lc3NfcG9zaXRpdmVfZWZmZWN0IiwgImNpdHlfcGVyY2VudGFnZV9wcm90ZWN0ZWQiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgImNpdHlfbmR2aSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicGVybWFuZW50X3dhdGVyIiwgInJlZ2lvbl81MGttX3N1c20iLCAicmVnaW9uXzIwa21fbmR2aSIsICJyZWdpb25fMjBrbV91cmJhbiIsICJzaHJ1YnMiLCAgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgImhhcHBpbmVzc19wb3NpdGl2ZV9lZmZlY3QiLCAiY2l0eV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWF4IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9tYXgiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9tYXgiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInJlZ2lvbl81MGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iLCAic2hydWJzIiwgICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJoYXBwaW5lc3NfcG9zaXRpdmVfZWZmZWN0IiwgImNpdHlfcGVyY2VudGFnZV9wcm90ZWN0ZWQiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21heCIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIpXSkKYGBgCgoibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIgoKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGEgPC0gZmV0Y2hfY2l0eV9kYXRhX2ZvcignYmlyZGxpZmUnKQpiaXJkbGlmZV9jaXR5X2RhdGEKYGBgCgpgYGB7cn0KZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YSwgYWVzKHJlc3BvbnNlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCA8LSByZkltcHV0ZShyZXNwb25zZSB+IC4sIGJpcmRsaWZlX2NpdHlfZGF0YSkKYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkCmBgYAoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCkKYGBgCgpgYGB7cn0KZXhjbHVkZV9iaXJkbGlmZSA8LSAhbmFtZXMoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkKSAlaW4lIHNlbGVjdF9zY2FsZXModXJiYW4gPSAxMDAsIGN1bHRpdmF0ZWQgPSAxMDAsIGVsZXZhdGlvbl9kZWx0YSA9IDIwLCBtZWFuX2VsZXZhdGlvbiA9IDEwMCwgYXZlcmFnZV9wb3BfZGVuc2l0eSA9IDIwLCBpbmNsdWRlc19lc3R1YXJ5ID0gTkEsIHNzbSA9IDUwLCBzdXNtID0gMTAwLCBuZHZpID0gMTAwLCBwZXJjZW50YWdlX3Byb3RlY3RlZCA9IDEwMCkKCmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUgPC0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxleGNsdWRlX2JpcmRsaWZlXQpiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfc2luZ2xlX3NjYWxlCmBgYAoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUpCmBgYAoKYGBge3J9CmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXNfYW5kX3N0cmVldHMiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXNfYW5kX3N0cmVldHMiLCAicmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJzaHJ1YnMiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInNocnVicyIsICJtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAic2hydWJzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAic2hydWJzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAic2hydWJzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAic2hydWJzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIsICJjaXR5X3N1c20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInNocnVicyIsICJtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOSIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX3N0cmVldHMiLCAicmFpbmZhbGxfYW5udWFsX2F2ZXJhZ2UiLCAiY2l0eV9zdXNtIiwgInJlZ2lvbl8xMDBrbV9uZHZpIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXNfYW5kX3N0cmVldHMiLCAicmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJzaHJ1YnMiLCAibWVhbl9wb3B1bGF0aW9uX2V4cG9zdXJlX3RvX3BtMl81XzIwMTkiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19zdHJlZXRzIiwgInJhaW5mYWxsX2FubnVhbF9hdmVyYWdlIiwgImNpdHlfc3VzbSIsICJyZWdpb25fMTAwa21fbmR2aSIsICJoYXBwaW5lc3NfZnV0dXJlX2xpZmUiKV0pCgpgYGAKCiJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIgoKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU28uLi4uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpNZXJsaW46ICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iCkJpcmRsaWZlOiAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIKCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVHJ5IE1vZGVsbGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmxpYnJhcnkoYm9vdCkKYGBgCgoKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX25hbWVkIDwtIGZldGNoX2NpdHlfZGF0YV9mb3IoJ21lcmxpbicsIFQpCmJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCA8LSBmZXRjaF9jaXR5X2RhdGFfZm9yKCdiaXJkbGlmZScsIFQpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClVzZSBjcm9zcyB2YWxpZGF0aW9uIGFuZCBkcm9wcGluZyB0ZXJtcyB0byBmaW5kIGJlc3QgbW9kZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIENhbiB3ZSBkcm9wIG9uZT8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcG9wdWxhdGlvbl9ncm93dGggKyByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcG9wdWxhdGlvbl9ncm93dGggKyByZWdpb25fNTBrbV9zc20gKyByZWFsbSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBwb3B1bGFpb25fZ3Jvd3RoICgxNC4zMDM4NCkKCi0tIGNhbiB3ZSBkcm9wIGFub3RoZXI/CmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHJlZ2lvbl81MGttX3NzbSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBzc20gKDE0LjIwODg5KQoKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgYmlvbWVfbmFtZSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaW9tZV9uYW1lICsgcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBiaW9tZSAoMTMuMTAxMzEpCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IG1lcmxpbl9wb29sX3NpemUgKiByZWFsbSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBiZXN0IG1vZGVsIHdpdGggbWVybGluIGlzIHBvb2wgc2l6ZSArIHJlYWxtIChDViBlcnJvciAxMy4xMDEzMSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfZml4ZWQkcmVhbG0gPC0gZmFjdG9yKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQkcmVhbG0sIGxldmVscyA9IGMoIlBhbGVhcmN0aWMiLCAiTmVhcmN0aWMiLCAiQXVzdHJhbGFzaWEiLCAiSW5kb21hbGF5YW4iLCAiTmVvdHJvcGljIiwgIkFmcm90cm9waWMiKSkKc3VtbWFyeShnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IG1lcmxpbl9wb29sX3NpemUgKyByZWFsbSkpCmBgYAoKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gY2FuIHdlIGRyb3AgYSB2YXJpYWJsZT8KCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgcmVhbG0sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyBwb3B1bGF0aW9uX2dyb3d0aCArIGJpb21lX25hbWUgKyByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHJlZ2lvbl81MGttX3NzbSArIGJpb21lX25hbWUgKyByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBiaW9tZSAoNS40OTI1MzYpCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyBwb3B1bGF0aW9uX2dyb3d0aCArIHJlZ2lvbl81MGttX3NzbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVhbG0sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyByZWdpb25fNTBrbV9zc20gKyByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgcmVhbG0sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIHBvcHVsYXRpb24gZ3Jvd3RoICg1LjM4NjA5KQpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyByZWdpb25fNTBrbV9zc20sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlYWxtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBzc20gKDUuMzgwMzMpCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSAqIHJlYWxtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIHNvIGJlc3QgbW9kZWwgd2l0aCBiaXJkbGlmZSBpcyBwb29sIHNpemUgKyByZWFsbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkJHJlYWxtIDwtIGZhY3RvcihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQkcmVhbG0sIGxldmVscyA9IGMoIlBhbGVhcmN0aWMiLCAiTmVhcmN0aWMiLCAiQXVzdHJhbGFzaWEiLCAiSW5kb21hbGF5YW4iLCAiTmVvdHJvcGljIiwgIkFmcm90cm9waWMiKSkKc3VtbWFyeShnbG0oZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gYmlyZGxpZmVfcG9vbF9zaXplICsgcmVhbG0pKQpgYGAKCmBgYHtyfQpnZ3Bsb3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyh4ID0gbWVybGluX3Bvb2xfc2l6ZSwgeSA9IHJlc3BvbnNlKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgc2UgPSBGKSArIGZhY2V0X3dyYXAofiByZWFsbSkKYGBgCgpgYGB7cn0KZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyh4ID0gYmlyZGxpZmVfcG9vbF9zaXplLCB5ID0gcmVzcG9uc2UpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBzZSA9IEYpICsgZmFjZXRfd3JhcCh+IHJlYWxtKQpgYGAKCmBgYHtyfQpiaXJkbGlmZS5maXQgPC0gZ2xtKGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyByZWFsbSkKc3VtbWFyeShiaXJkbGlmZS5maXQpCndpdGgoc3VtbWFyeShiaXJkbGlmZS5maXQpLCAxIC0gZGV2aWFuY2UvbnVsbC5kZXZpYW5jZSkKcGxvdChiaXJkbGlmZS5maXQpCmBgYAoKYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygxNiwgNTMsIDExNiwgMTIzKSwgYygibmFtZSIsICJiaXJkbGlmZV9wb29sX3NpemUiKV0KYGBgCgpgYGB7cn0KZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyh4ID0gYmlyZGxpZmVfcG9vbF9zaXplLCB5ID0gcmVzcG9uc2UpKSArIAogIGdlb21fcG9pbnQoc2l6ZT0xKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBzZSA9IEYpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbmFtZSksIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsW2MoMTYsIDUzLCAxMjMpLF0sIHNpemUgPSAzLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHZqdXN0ID0gImlud2FyZCIsIGhqdXN0ID0gImlud2FyZCIsIGNvbG9yID0gInJlZCIsIGFuZ2xlPS0xNSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygxNiwgNTMsIDEyMyksXSwgY29sb3IgPSAicmVkIikgKwogIGZhY2V0X3dyYXAofiByZWFsbSkgKwogIHRoZW1lX2J3KCkgKwogIHlsYWIoIkNpdHkgUmFuZG9tIEVmZmVjdCBJbnRlcmNlcHQiKSArIHhsYWIoIlJlZ2lvbmFsIFBvb2wgU2l6ZSIpICsgbGFicyh0aXRsZSA9ICJCaXJkbGlmZSIpCgpnZ3NhdmUoImNpdHlfZWZmZWN0X3JpY2huZXNzX19vdXRwdXRfX2JpcmRsaWZlLmpwZyIpCmBgYAoKYGBge3J9Cm1lcmxpbi5maXQgPC0gZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHJlYWxtKQpzdW1tYXJ5KG1lcmxpbi5maXQpCndpdGgoc3VtbWFyeShtZXJsaW4uZml0KSwgMSAtIGRldmlhbmNlL251bGwuZGV2aWFuY2UpCnBsb3QobWVybGluLmZpdCkKYGBgCgpgYGB7cn0KY2l0eV9kYXRhW2MoNywgMjQsIDc3KSwgYygibmFtZSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAibWVybGluX3Bvb2xfc2l6ZSIpXQpgYGAKCmBgYHtyfQpnZ3Bsb3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyh4ID0gbWVybGluX3Bvb2xfc2l6ZSwgeSA9IHJlc3BvbnNlKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAxKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBzZSA9IEYpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbmFtZSksIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbFtjKDcsIDI0LCA3NyksXSwgc2l6ZSA9IDMsIHBvc2l0aW9uID0gImRvZGdlIiwgdmp1c3QgPSAiaW53YXJkIiwgaGp1c3QgPSAiaW53YXJkIiwgY29sb3IgPSAicmVkIiwgYW5nbGU9LTE1KSArCiAgZ2VvbV9wb2ludChkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYyg3LCAyNCwgNzcpLF0sIGNvbG9yID0gInJlZCIpICsKICBmYWNldF93cmFwKH4gcmVhbG0pICsKICB0aGVtZV9idygpICsKICB5bGFiKCJDaXR5IFJhbmRvbSBFZmZlY3QgSW50ZXJjZXB0IikgKyB4bGFiKCJSZWdpb25hbCBQb29sIFNpemUiKSArIGxhYnModGl0bGUgPSAiZUJpcmQiKQoKZ2dzYXZlKCJjaXR5X2VmZmVjdF9yaWNobmVzc19fb3V0cHV0X19tZXJsaW4uanBnIikKYGBgCgpgYGB7cn0KbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzIDwtIHJlc2lkKG1lcmxpbi5maXQpCmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHkgPSByZXNwb25zZSwgeCA9IHJlc2lkdWFscykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSByZWFsbSkpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYyg3LCAyNCwgNzcpLF0sIHNpemUgPSA0LCBwb3NpdGlvbiA9ICJkb2RnZSIsIHZqdXN0ID0gImlud2FyZCIsIGhqdXN0ID0gImlud2FyZCIpICsgCiAgbGFicyh0aXRsZSA9ICJNZXJsaW4iLCBzdWJ0aXRsZSA9IHBhc3RlKCJDb3JyZWxhdGlvbiIsIGNvcihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMsIG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc3BvbnNlKSkpICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzIDwtIHJlc2lkKGJpcmRsaWZlLmZpdCkKZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyh5ID0gcmVzcG9uc2UsIHggPSByZXNpZHVhbHMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRiwgYWxwaGEgPSAwLjUpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHJlYWxtKSkgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbmFtZSksIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsW2MoMTYsIDUzLCAxMjQpLF0sIHNpemUgPSA0LCBwb3NpdGlvbiA9ICJkb2RnZSIsIHZqdXN0ID0gImlud2FyZCIsIGhqdXN0ID0gImlud2FyZCIpICsKICBsYWJzKHRpdGxlID0gIkJpcmRsaWZlIiwgc3VidGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb24iLCBjb3IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMsIGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzcG9uc2UpKSkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHNfb2ZfZml0IDwtIHJlc2lkKGxtKHJlc3BvbnNlIH4gcmVzaWR1YWxzLCBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkKZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyh4ID0gcmVhbG0sIHkgPSByZXNpZHVhbHNfb2ZfZml0KSkgKyBnZW9tX2JveHBsb3QoKQpgYGAKCmBgYHtyfQpiaXJkbGlmZS5hb3YgPC0gYW92KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzX29mX2ZpdCB+IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVhbG0pCnN1bW1hcnkoYmlyZGxpZmUuYW92KQpgYGAKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHNfb2ZfZml0IDwtIHJlc2lkKGxtKHJlc3BvbnNlIH4gcmVzaWR1YWxzLCBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpCmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHggPSByZWFsbSwgeSA9IHJlc2lkdWFsc19vZl9maXQpKSArIGdlb21fYm94cGxvdCgpCmBgYAoKYGBge3J9Cm1lcmxpbi5hb3YgPC0gYW92KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFsc19vZl9maXQgfiBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkKc3VtbWFyeShtZXJsaW4uYW92KQpgYGAKCgpgYGB7cn0KZ2dwbG90KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBhZXMocmVzaWR1YWxzKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKYGBge3J9CmdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBhZXMocmVzaWR1YWxzKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKYGBge3J9CnNoYXBpcm8udGVzdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc3BvbnNlKQpzaGFwaXJvLnRlc3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMpCnNoYXBpcm8udGVzdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFsc19vZl9maXQpCgpzaGFwaXJvLnRlc3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzcG9uc2UpCnNoYXBpcm8udGVzdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMpCnNoYXBpcm8udGVzdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHNfb2ZfZml0KQpgYGAKClZhcmlhbmNlcyBvZiBncm91cHMgYXJlIE5PVCBzaWduaWZpY2FudGx5IGRpZmZlcmVudDoKYGBge3J9CmJhcnRsZXR0LnRlc3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzLCBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkgCmxldmVuZVRlc3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzLCBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkgCmBgYAoKVmFyaWFuY2VzIG9mIGdyb3VwcyBhcmUgTk9UIHNpZ25pZmljYW50bHkgZGlmZmVyZW50OgpgYGB7cn0KYmFydGxldHQudGVzdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFscywgYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkgCmxldmVuZVRlc3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMsIGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVhbG0pIApgYGAKClZhcmlhbmNlcyBvZiBncm91cHMgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50OgpgYGB7cn0KYmFydGxldHQudGVzdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHNfb2ZfZml0LCBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkgCmxldmVuZVRlc3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzX29mX2ZpdCwgbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVhbG0pIApgYGAKClZhcmlhbmNlcyBvZiBncm91cHMgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50OgpgYGB7cn0KYmFydGxldHQudGVzdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFsc19vZl9maXQsIGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVhbG0pIApsZXZlbmVUZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzX29mX2ZpdCwgYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkgCmBgYAoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQ2hlY2sgQUlDCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpBSUMoCiAgZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcG9wdWxhdGlvbl9ncm93dGggKyByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgcmVhbG0pLAogIGdsbShkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHJlYWxtKQopCmBgYAoKYGBge3J9CkFJQygKICBnbG0oZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gYmlyZGxpZmVfcG9vbF9zaXplICsgcG9wdWxhdGlvbl9ncm93dGggKyByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgcmVhbG0pLAogIGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyByZWFsbSkKKQpgYGAK